<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    包装类

    <script>
        let s = 'abc'
        console.log(s.length);

        // JS中一切皆对象
        // 除了 null undefined不能被转换为包装类 其他都可以
        // 布尔值通过 new Boolean()
        // 字符串值通过 new String()
        // 数值通过 new Number()

        /**
         * 中间经历三个步骤
         * 1. let s1 = new String('abc')
         * 2. let b = s1.substring(2)
         * 3. s1 = null (销毁当前势力)
         * */
        let a = 'abc'
        let b = a.substring(2)
        console.log(a); // a没有发生改变 因为第三步被销毁了
        console.log(b);

        // s1 s2 都没有color属性就是因为在第三步被销毁了
        // s3是实例化一个包装类，所以可以附上属性
        let s1 = 'abc'
        s1.color = 'red'
        console.log(s1.color); // undefined

        let s2 = String('abc')
        s2.color = 'red'
        console.log(s2.color); // undefined

        let s3 = new String('abc')
        s3.color = 'red'
        console.log(s3.color); // red

        // 证明String('abc')方式和直接赋值是完全一样的
        console.log(s1 == s2); // true
        console.log(s1 === s2);  // true
        
        // ==说明只是值相同 但是类型不一样
        console.log(s1 == s3); // true
        console.log(s1 === s3); // false




    </script>
</body>
</html>